﻿/*
 * modbusrtu.hpp
 *
 *  Created on: 2017年3月14日
 *      Author: work
 */

#ifndef _DM_PROTOCOL_MODBUSRTU_HPP_
#define _DM_PROTOCOL_MODBUSRTU_HPP_

#include <dm/export.hpp>

#ifndef DM_API_PROTOCOL
#define DM_API_PROTOCOL DM_API_IMPORT
#endif

#include <dm/protocol/framemodbusrtu.hpp>
#include <dm/protocol/protocol.hpp>

namespace dm{
namespace protocol{

/**
 * ModbusRTU规约基类
 * @see CModbusRtuSlaver 和 CModbusRtuMaster
 */
class DM_API_PROTOCOL CModbusRtu:virtual public CProtocol{
public:
	typedef CFrameModbusRtu::address_t address_t;

	CModbusRtu();
	virtual ~CModbusRtu();

	CFrame& getRxFrame();
	const CFrame& getTxFrame();

	inline const address_t& getModbusAddr()const{
		return m_modbusAddr;
	}

	inline void setModbusAddr( const address_t& addr ){
		m_modbusAddr = addr;
	}

	bool filterRxFrame()const;

protected:
	/**
	 * 获取帧对象
	 * @return
	 */
	inline CFrameModbusRtu& rxFrame(){
		return *m_rxFrame;
	}

	/**
	 * 获取帧对象
	 * @return
	 */
	inline CFrameModbusRtu& txFrame(){
		return *m_txFrame;
	}

	/**
	 * 产生帧对象
	 * 子类应该实现该函数，以提供具体规约解析编码帧
	 * @return
	 */
	virtual CFrameModbusRtu* genRxTempFrame()=0;
	virtual CFrameModbusRtu* genTxTempFrame()=0;

private:
	CFrameModbusRtu* m_rxFrame;	// 接收帧
	CFrameModbusRtu* m_txFrame;	// 发送帧

	address_t m_modbusAddr;	// modbus地址，子站地址或者本地地址
};

}
}



#endif /* INCLUDE_DM_OS_PROTOCOL_MODBUSRTU_HPP_ */
